from . import news_blue
from flask import *
from info import db
from info.utils import validate_request as vr
from info.models import *


#新闻的详情页
@news_blue.route('/news',methods=['post','get'])
def news_index_handler():
    # 找到当前登录用户的对象
    user: User = User.query.filter(User.id == session.get('user_id')).first()
    if request.method=='GET':
        #获取到新闻的id
        newsid = request.args.get('newsid')
        # 根据新闻id找到新闻对象
        news = News.query.filter(News.id == newsid).first()
        # 根据新闻id找到作者
        news_creater = User.query.filter(User.id == news.user_id).first()
        # print(news_creater)
        # 根据作者的id找到作者的上传的新闻个数
        news_num = news_creater.release_new_s.count()
        # 根据作者的id找到到作者的粉丝个数
        fans_num = news_creater.fan_s.count()
        # 根据新闻id找到新闻评论的个数
        comment_num = news.comment_s.count()
        # 返回点击排行点击次数前六个items
        news_rank_index = News.query.order_by(News.visited_num.desc()).paginate(1, 6).items
        try:
            news.visited_num += 1
            db.session.add(news)
            db.session.commit()
            print('ok')
        except:
            db.session.rollback()
            return vr.failure
        if user:
            collection_s=user.collection_s
            #如果没有收藏新闻，收藏状态为0，收藏之后收藏状态为1
            if news not in collection_s:
                collect_status=0
            else:
                collect_status=1
            concern_s=user.concern_s
            #如果没有关注作者，关注状态为0，关注之后关注状态为1
            if news_creater not in concern_s:
                focus_status=0
            else:
                focus_status=1
            return render_template('news/detail.html', user=user, news=news, news_creater=news_creater,collect_status=collect_status,focus_status=focus_status,
                                   news_num=news_num, fans_num=fans_num, comment_num=comment_num, news_rank_index=news_rank_index)
        return render_template('news/detail.html',user=user, news=news, news_creater=news_creater, news_num=news_num,
                               fans_num=fans_num, comment_num=comment_num, news_rank_index=news_rank_index)
    else:
        #获取新闻作者的id和新闻的id
        news_creater_id=request.form.get('news_creater_id')
        # print(news_creater_id)
        news_creater=User.query.filter(User.id==news_creater_id).first()
        newsid=request.form.get('newsid')
        # print(news_creater_id)
        news=News.query.filter(News.id==newsid).first()
        #如果有新闻作者的id,用户一定是进行作者关注与取消关注操作
        if news_creater_id:
            try:
                if news_creater in user.concern_s:
                    user.concern_s.remove(news_creater)
                else:
                    user.concern_s.append(news_creater)
                db.session.commit()
                print('ok')
            except:
                db.session.rollback()
                return vr.failure
            return vr.sucess
        #如果有新闻的id,用户一定是进行收藏新闻与取消收藏新闻操作
        if newsid:
            try:
                if news in user.collection_s:
                    user.collection_s.remove(news)
                else:
                    user.collection_s.append(news)
                db.session.commit()
                print('ok')
            except:
                db.session.rollback()
                return vr.failure
            return vr.sucess
        if not news_creater_id and newsid:
            return vr.failure

#管理员的一级新闻编辑页面
@news_blue.route('/news_edit')
def news_edit_handler():
    #获取搜索框的内容
    request_text=request.args.get('text')
    #如果获取不到没有搜索字段，按时间排序显示新闻
    if not request_text:
        # 获取当前页数
        current_page = request.args.get('page',1,type=int)
        # 获取新闻列表某一页的新闻
        news_s_s = News.query.order_by(News.createDatetime.desc()).paginate(current_page, per_page=10)
        news_s=news_s_s.items
        total_page=news_s_s.pages
        return render_template('admin/news_edit.html', news_s=news_s,total_page=total_page,current_page=current_page)
    #获取到搜索字段就按模糊查询的结果来显示
    else:
        # 获取当前页数
        current_page = request.args.get('page',1,type=int)
        # 获取新闻列表某一页的新闻
        news_s_s = News.query.filter(News.title.contains(request_text)).paginate(current_page,10)
        news_s = news_s_s.items
        total_page = news_s_s.pages
        return render_template('admin/news_edit.html',news_s=news_s,total_page=total_page,current_page=current_page)

#管理员的二级新闻编辑页面
@news_blue.route('/news_edit_detail',methods=['post','get'])
def news_edit_detail_handler():
    #新闻编辑页面
    if request.method=='GET':
        #如果是get请求，显示新闻的相关内容
        request_newsid=request.args.get('newsid')
        request_news=News.query.filter(News.id==request_newsid).first()
        category_s=Category.query.order_by(Category.id.desc()).paginate(1,10).items
        return render_template('admin/news_edit_detail.html',request_news=request_news,category_s=category_s)
    else:
        #如果是post请求，获取表单的相关数据
        #获取管理员编辑后的新闻的标题内容
        title = request.form.get('text')
        #获取管理员编辑后的新闻的种类
        type = request.form.get('option')
        #根据分类的category找到种类的id
        category_id=Category.query.filter(Category.category==type).first().id
        #获取管理员编辑后的新闻的摘要内容
        summary = request.form.get('summary')
        #获取管理员编辑后的新闻的标题正文
        body = request.form.get('content')
        #获取管理员编辑的新闻的id
        edit_news_id=request.form.get('edit_news_id')
        #获取管理员编辑的新闻的image_url地址
        new_image_url = request.files.get('new_image_url')
        #****************************************************
        #修改数据库对应的news对象
        news=News.query.filter(News.id==edit_news_id).first()
        news.title = title
        news.summary = summary
        news.body = body
        news.category_id = category_id
        #对用户的new_image_url进行处理
        if new_image_url:
            #判断图片是否符合要求
            error_image=vr.v_file(new_image_url)
            if error_image:return error_image
            # print('----------')
            # 保存图片，格式统一为png
            basepath = 'info/static/news_image/'
            new_image_url.save(basepath + edit_news_id + '.png')
            # 文件获取路径
            image_url = '/static/news_image/' + edit_news_id + '.png'
            news.image_url=image_url
        try:
            db.session.add(news)
            db.session.commit()
            # 刷新，不然报错=======就这么用，不懂为啥
            db.session.merge(news)
            db.session.refresh(news)
            # ======================================
        except:
            db.session.rollback()
            return vr.failure
        return vr.sucess


#管理员的新闻分类页面
@news_blue.route('/news_type',methods=['get','post'])
def news_type_handler():
    if request.method=='GET':
        #如果是get请求，显示所有的分类
        category_s=Category.query.order_by(Category.id).paginate(1,10).items
        return render_template('admin/news_type.html',category_s=category_s)
    else:
        #如果是post请求,根据是否有id来判断是增加分类请求还是修改分类请求
        id=request.form.get('id')
        type_name = request.form.get('name')
        # category_name=request.form.get('category_name')
        if id:
            # print(id)
            #有id的为修改分类请求
            category_s = Category.query.order_by(Category.id).paginate(1, 10).items
            category=category_s[int(id)]
            print(category)
            category.category=type_name
            # return 'ok'
            try:
                db.session.add(category)
                db.session.commit()
                print('ok')
            except:
                db.session.rollback()
                return vr.failure

        else:
            #没有id的为增加分类请求
            category = Category(category=type_name)
            try:
                db.session.add(category)
                db.session.commit()
                print('ok')
            except:
                db.session.rollback()
                return vr.failure

        category_s = Category.query.order_by(Category.id).paginate(1, 10).items
        return render_template('admin/news_type.html', category_s=category_s)
